﻿using System;
using System.Collections.Generic;
using System.Dynamic;

namespace InDepth2Demo.Chapter1314
{
    internal class DynamicBehavior
    {
        // 用 ExpandObject 存储和获取值
        // 代码清单14-25简单地将字符串作为字典的值——实际上你可以在IDictionary<string, object>中使用任何对象。
        public static void Call()
        {
            dynamic expando = new ExpandoObject();
            IDictionary<string, object> dic = expando;
            expando.First = "value set dynamiclly";
            Console.WriteLine(dic["First"]);

            dic["Second"] = "value set with dictionary";
            Console.WriteLine(expando.Second);
        }

        //用委托伪造ExpandoObject的方法。如果将值指定为一个委托，你可以像调用expando的方法那样调用该委托
        public static void Call2()
        {
            dynamic expando = new ExpandoObject();
            expando.AddOne = (Func<int, int>)(x => x + 1);
            Console.WriteLine(expando.AddOne(10));

            //管看上去像方法调用，但也可以看成是访问一个返回委托的属性，然后调用该委托。
            //如果你创建了一个静态类型的类，它包含一个类型为Func<int,int>的AddOne属性，调用的语法是完全相同的。
            //C#生成的调用AddOne的代码实际上确实是“调用成员”的操作，而不是访问属性然后再调用，不过ExpandoObject知道该做什么。如果你愿意，完全可以访问属性以获取委托。
        }


    }
}
